package com.tan00xu.service.impl;

import com.alibaba.fastjson.JSON;
import com.tan00xu.pojo.User;
import com.tan00xu.service.LoginService;
import com.tan00xu.service.TokenService;
import com.tan00xu.service.UserService;
import com.tan00xu.utils.CmdOutputInformationUtils;
import com.tan00xu.utils.JWTUtils;
import com.tan00xu.vo.ErrorCode;
import com.tan00xu.vo.Result;
import com.tan00xu.vo.params.LoginParam;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private UserService userService;

    @Autowired
    private TokenService tokenService;
    //    @Autowired
    @Resource
    private RedisTemplate<String, String> redisTemplate;

    //加密盐
    private static final String SALT = "@TAN00XU@";


    /**
     * 登录
     *
     * @param loginParam 包含账号和密码
     * @return Result
     */
    @Override
    public Result login(LoginParam loginParam) {
        /*
            1. 检查参数是否合法
            2. 根据用户名和密码在User表中查询
            3. 不存在 登录失败
            4. 存在 生成token并返回
            5. 将token放入Redis中 缓存 token:user信息 设置过期时间
            **登录时，先认证token是否合法，去token认证是否存在
         */
        String account = loginParam.getAccount();
        String password = loginParam.getPassword();
        //验证用户名和密码是否为空
        if (StringUtils.isEmpty(account) || StringUtils.isEmpty(password)) {
            return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "账户或密码不符合规范");
        }
        //md5处理密码的加密
        password = DigestUtils.md5Hex(password + SALT);
        User user = userService.getUserByAccountAndPassword(account, password);
        if (user == null) {
            return Result.fail(ErrorCode.ACCOUNT_PWD_NOT_EXIST.getCode(), ErrorCode.ACCOUNT_PWD_NOT_EXIST.getMsg());
        }
        //生成token
        String token = JWTUtils.createToken(user.getId());
        CmdOutputInformationUtils.info("token:" + token + "\n用户id:" + user.getId() + "登录成功");
        //保存缓存，有效期为1天
        redisTemplate.opsForValue().set("TOKEN_" + token, JSON.toJSONString(user), 1, TimeUnit.DAYS);
        return Result.success(token);
    }

    /**
     * 根据前端传入的token来删除缓存中的用户信息
     *
     * @param token 前端传回的token
     * @return
     */
    @Override
    public Result logout(String token) {

        //删除redis中的token
        Boolean aBoolean = tokenService.deleteRedis("TOKEN_" + token);
        if (aBoolean) {
            CmdOutputInformationUtils.info("退出登录成功");
            return Result.success("退出登录成功");
        }
        CmdOutputInformationUtils.error("redis中的token不存在!缓存异常！");
        return Result.fail(ErrorCode.REDIS_ERROR.getCode(), ErrorCode.REDIS_ERROR.getMsg());
    }

    /**
     * 注册
     *
     * @param loginParam 包含账号、密码、昵称
     * @return Result
     */
    @Override
    public Result register(LoginParam loginParam) {
        /*
            1. 判断参数是否合法
            2. 判断账户是否已经存在 存在则注册失败
            3. 如果不存在 则注册成功
            4. 生成token
            5. 存入redis中并返回
            6. 注意！加上事务，防止出现账号重复的情况，一旦出现问题，则回滚
         */
        String account = loginParam.getAccount();
        String password = loginParam.getPassword();
        String nickname = loginParam.getNickname();
        //验证参数是否合法，账号、密码、昵称不能为空
        if (StringUtils.isBlank(account)
                || StringUtils.isBlank(password)
                || StringUtils.isBlank(nickname)
        ) {
            return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMsg());
        }
        User user = userService.getUserByAccount(account);
//        CmdOutputInformationUtils.error("测试测试彩色"+user);
        if(user != null){
            return Result.fail(ErrorCode.ACCOUNT_EXIST.getCode(), ErrorCode.ACCOUNT_EXIST.getMsg());
        }
        user = new User();
        user.setAccount(account);
        user.setPassword(DigestUtils.md5Hex(password + SALT));
        user.setNickname(nickname);
        user.setCreateDate(System.currentTimeMillis());
        user.setLastLogin(System.currentTimeMillis());
        user.setAvatar("/static/img/user/default.png");
        user.setAdmin(0);
        user.setDeleted(0);
        user.setEmail("");
        user.setStatus("");
        this.userService.save(user);
        //生成token
        String token = JWTUtils.createToken(user.getId());
        CmdOutputInformationUtils.info("token:" + token + "\n用户id:" + user.getId() + "注册成功");
        //保存缓存，有效期为1天
        redisTemplate.opsForValue().set("TOKEN_" + token, JSON.toJSONString(user), 1, TimeUnit.DAYS);

        return Result.success(token);
    }


    public static void main(String[] args) {
        System.out.println(DigestUtils.md5Hex("123123" + SALT));
    }
}
